/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package clases;

/**
 *
 * @author juanjito
 */

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.FlushModeType;
import javax.persistence.Persistence;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Vector;

public class main2 {
    
    public main2(){}

  public  Vector<Receta> ObtenerListaRecetas(){
       EntityManagerFactory emf = Persistence.createEntityManagerFactory("recetasUnit");
        EntityManager em;
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
       
       Vector<Receta> recetas = new Vector<Receta>(0,1);
        
        //Aqui sacamos toda la lista de resultados
        recetas = (Vector<Receta>)em.createQuery("SELECT r FROM Receta r WHERE r.id>0").getResultList();
        return recetas;
   }
   
   public Receta ObtenerReceta(){
       EntityManagerFactory emf1 = Persistence.createEntityManagerFactory("recetasUnit");
        EntityManager em1;
        em1 = emf1.createEntityManager();
        em1.setFlushMode(FlushModeType.AUTO);
        Random rand = new Random();
        int x = 0;
       
     
       List<Receta> recetas = new ArrayList();
        
        //Aqui sacamos toda la lista de resultados
        recetas =em1.createQuery("SELECT r FROM Receta r WHERE r.id>0").getResultList();
        x=rand.nextInt(recetas.size());
        return recetas.get(x);
   }
    public Receta CombinarReceta(Receta r1,List<Receta> recetas){
        //Establecemos una serie de criterios para que nos busque una receta
        //adecuada a la que ya tenemos
        Receta r_new= new Receta();
        for(int i=0;i<recetas.size();i++) {
            //Primero ponemos que no supere las mil Calorias
            if((r1.getKcal()+recetas.get(i).getKcal()<=1000)&&
            //Que no superen 180 minutos de preparacion
            (r1.getDuracion()+recetas.get(i).getDuracion()<=180)&&
            //Que sean de diferente tipo
             (r1.getTipo()!=recetas.get(i).getTipo())&&
             //que no sea la misma receta
             (!r1.getNombre().equals(recetas.get(i).getNombre())))
            {
                r_new=recetas.get(i);
                return r_new;
            }
        }
        return r_new;
    }
    public void InprimirReceta(Receta r)
    {
        System.out.println("Nombre de la receta: "+r.getNombre());
            System.out.println("Nacionalidad: "+r.getNacionalidad().getNombre());
            System.out.println("Tipo de comida: "+r.getTipo().getNombre());
            System.out.println("Dificultad: "+r.getDificultad());
            System.out.println("Bebida que lo acompaña: "+r.getVino().getNombre());
            System.out.println("Kilocalorias: "+r.getKcal());
    }
    public boolean CriterioDiario(Receta almuerzo, Receta cena)
    {
        //Que no pase de las calorias recomendadas
            if((almuerzo.getKcal()+cena.getKcal()<=1200)&&
            //Que sean de diferente tipo
             (almuerzo.getTipo()!=cena.getTipo())&&
             //que no sea la misma receta
             (!almuerzo.getNombre().equals(cena.getNombre())))
                    return true;
            else
                    return false;
    }
    
    public  Receta Cena(Vector<Receta> rs,Receta almuerzo){
       Receta cena = new Receta();
       Boolean enc=false;
       //Escogemos cena al azar para no tener siempre las mismas
       Random rand = new Random();
        int x = 0;
        
        while(!enc)
        {
            x=rand.nextInt(rs.size());
            if (CriterioDiario(almuerzo,rs.get(x)))
            {
                cena=rs.get(x);
                enc=true;
            }
        }
       return cena;
    }
   public  Vector<Receta> MenuDia(Vector<Receta> rs){
       Vector<Receta> r_dia = new Vector<Receta>(0,1);
       Receta cena = new Receta();
       
       //Elegimos una receta aleatoria
       Random rand = new Random();
        int x = rand.nextInt(rs.size());
       //La introducimos en el menu del dia
        r_dia.add(rs.get(x));
        //Ahora buscamos la cena para ese almuerzo
        cena = Cena(rs,rs.get(x));
        //Añadimos la cena
        r_dia.add(cena);
        
      return r_dia;
   }
   public  Vector<Receta> MenuSemanal(Vector<Receta> rs){
       Vector<Receta> m_semana = new Vector<Receta>(0,1);
       //Receta comida = new Receta();
       Vector<Receta> m_dia = new Vector<Receta>(0,1);
       int dia=1;
       boolean enc=false;
       boolean iguales=false;
       //Introducimos el primer menu el del lunes
       //Y ahora tenemos que introducir 6 menus mas
       //utilizamos los mismos criterios pero comprobamos que no halla
       //ningun plato repetido
       m_semana= MenuDia(rs);
        while(!enc)
        {
           m_dia = this.MenuDia(rs);
           iguales = false;
           for(int j=0; j<m_semana.size();j++)
           {
               if((m_semana.get(j)==m_dia.get(0))||(m_semana.get(j)==m_dia.get(1)))
               {
                  iguales=true;
               }
           }
           //sino son iguales a ninguno de la semana se introducen en el menu semanal
           if(!iguales)
           {
               m_semana.add(m_dia.get(0));
               m_semana.add(m_dia.get(1));
               dia++;
               if(dia==2)
                  enc=true;
           }
       }
       return m_semana;
   }
   
    public static void main(String[] args) {
        Receta receta,r_com;
        receta = new Receta();
        r_com = new Receta();
        
        Vector<Receta> recetas = new Vector<Receta>(0,1);
        Vector<Receta> menu_dia = new Vector<Receta>(0,1);
        Vector<Receta> menu_semana = new Vector<Receta>(0,1);
        
        main2 m = new main2();
        //Primero Cargamos la lista de las recetas
        recetas=m.ObtenerListaRecetas();
        //Cargamos una recta para cominar
        receta=m.ObtenerReceta();
        m.InprimirReceta(receta);
        //Y ahora combinamos y nos devuelve una receta adecuada
        if(!recetas.isEmpty())
        {    
        r_com=m.CombinarReceta(receta, recetas);
        m.InprimirReceta(r_com);
        //Probamos el menu diario
        menu_dia = m.MenuDia(recetas);
        System.out.println("¡¡¡¡MENU DEL DIA!!!!");
        m.InprimirReceta(menu_dia.get(1));
        m.InprimirReceta(menu_dia.get(0));
        //Funciona bien con las recetas que tengo
        //De todas fomras necesitamos llenarlo para comprobar que funciona todo
        //Ahora esta puesto el menu semanal solo a 2 dias por que no hay mas recetas
        System.out.println("¡¡¡¡MENU SEMANAL!!!!");
        menu_semana=m.MenuSemanal(recetas);
         for(int i=0;i<menu_semana.size();i++) {
             m.InprimirReceta(menu_semana.get(i));
         }
        
        }
    }

}
